package TDACola;

import TDALista.NodoS;



/**
 * Cola enlazada simple
 * @author Jordan
 *
 * @param <T>
 */
public class LinkedQueue<T> implements Queue<T>{
	private NodoS<T> head, tail;
	private int size;
	
	//Construstor
	public LinkedQueue(){
	head=tail=null; 
	size=0;
	}
//-------------------------------------------------------------
	@Override
	public int size() 
	{
		return size; //	CALCULADO=((max-head+tail)%max);
	}

//-------------------------------------------------------------
	@Override
	public boolean isEmpty() 
	{
		return size==0;
	}
//-------------------------------------------------------------
	@Override
	public T front() throws EmptyQueueException {
		if (isEmpty()) throw new EmptyQueueException("la cola:: front()");
		return head.getElement();
	}
//-------------------------------------------------------------	

	@Override
	public void enqueue(T element)
	{
		NodoS<T> aux=new NodoS<T>(element,null);
		if (isEmpty()) 
			head=tail=aux;
		else
		{
			tail.setNext(aux);
			tail=aux;
		}
	size++;
	}
//-------------------------------------------------------------	
	@Override
	public T dequeue() throws EmptyQueueException {
		if (isEmpty()) throw new EmptyQueueException("la cola:: dequeue()");
		NodoS<T> aux=head;
		head=head.getNext();
		if (size==1) tail=null;
		aux.setNextNull();
		size--;
		return aux.getElement();
	}
//-------------------------------------------------------------
	/**
	 * @return retorna un string mostrando el elemento que se inserto en la cola que llama al metodo.
	 */
	private String insertar(T t) {
	T aux=t;
	enqueue(aux);
	return "Se encolo el elemento "+aux;
	}
	
//-------------------------------------------------------------	
	/**retorna un string mostrando todos los  elementos de la cola que llama al metodo.
	 * @return retorna un string mostrando todos los  elementos de la cola que llama al metodo.
	 */
	protected String mostrar() {
	if (isEmpty()) return "No hay elementos en la Cola.";
	String s="Elementos enumerados desde la cabeza: ";
	NodoS<T> aux=head;
	while(aux!=null)
		{s=s+" "+aux.getElement();
		aux=aux.getNext();
		}
	return s;
	}
//-------------------------------------------------------------
	/**retorna un string mostrando el elemento buscado en la cola que llama al metodo.
	 * @return retorna un string mostrando el elemento buscado en la cola que llama al metodo.
	 */
	private String buscarSegunCriterio()
	{
	try 
		{	T aux=front();
			return "En el frente de la cola se encuentra el elemento "+aux;
		} 
	catch 
		(EmptyQueueException e) {return e.getMessage();}
		
	}
//-------------------------------------------------------------
	/**
	 * @return retorna un string mostrando el elemento quitado de la cola que llama al metodo.
	 */
	private String removerSegunCriterio() {
	try{
	T aux=dequeue();
	return "Se quito el elemento "+ aux + " de la cola.";
		}catch (EmptyQueueException e){return e.getMessage();}
		/**
		 * Si la cola estaba vacia retorna el mensaje de error.
		 */
	}
//-------------------------------------------------------------	
}
